iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
自我挑戰組

利用 node.js/express 架設網站系列 第 3

Day-03 node.js核心模組

  • 分享至 

  • xImage
  •  

今天要來學習node.js的核心模組
先來講講模組(modules)是什麼:
模組其實就是一個js檔案,每個模組都有不同的單一的功能,他們都有著共同的特性:
- 封裝性:模組中的變量和函數是封裝的,外部無法直接訪問,除非你通過模組的接口(exports或module.exports)將它們導出。
- 重用性:模組可以被其他文件或應用導入並使用,從而實現代碼的重用。
- 獨立性:模組可以單獨進行測試和維護,降低開發的複雜性。

模組也被分為三個類型:
- 核心模組:Node.js內建的模組,例如http、fs、path和events。這些模組可以直接使用,無需安裝。
- 第三方模組:社區開發者創建的模組,可以通過NPM安裝並使用,例如express、lodash等。
- 自定義模組:開發者自己創建的模組,用於分割應用程式的代碼。

今天就會來了解核心模組的其中幾個:https、fs、path、events

https模組

http模組用於創建HTTP伺服器和處理HTTP請求。

  • 首先是http.createServer(),用於創建一個http伺服器
const http = require('http');

const server = http.createServer((req, res) => {
    // req 是來自客戶端的請求對象
    // res 是伺服器發送回應的對象

    res.statusCode = 200; // 設置狀態碼
    res.setHeader('Content-Type', 'text/plain'); // 設置響應標頭
    res.end('Hello, World!\n'); // 發送響應內容
});

server.listen(port, hostname, () => {
    console.log(`伺服器運行在 http://${hostname}:${port}/`);
});
  • 第二個是http.request() http.get(),request用於發送 HTTP 請求、get是 http.request() 的簡化版本,適合用於發送 GET 請求。
    http.request()的語法:
const options = {
    hostname: 'www.example.com',
    port: 80,
    path: '/path',
    method: 'GET'
};

const req = http.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(`回應內容: ${data}`);
    });
});

req.on('error', (e) => {
    console.error(`發生錯誤: ${e.message}`);
});

req.end();

http.get()的語法:

const url = 'http://www.example.com/path';

http.get(url, (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(`回應內容: ${data}`);
    });
}).on('error', (e) => {
    console.error(`發生錯誤: ${e.message}`);
});

fs模組

fs模組提供文件系統操作,如讀取、寫入和刪除文件。

  • 讀取文件:

    非同步讀取:使用 fs.readFile() 來非同步地讀取文件內容,這樣不會阻塞程序的其他操作。
    const fs = require('fs');
    fs.readFile('example.txt', 'utf8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    
    同步讀取:使用 fs.readFileSync() 來同步地讀取文件內容,這會阻塞程序直到文件讀取完成。
    const fs = require('fs');
    
    const data = fs.readFileSync('example.txt', 'utf8');
    console.log(data);
    
  • 寫入文件:

    非同步寫入:使用 fs.writeFile() 來非同步地寫入文件,會覆蓋文件中的所有內容。
    const fs = require('fs');
    
    fs.writeFile('example.txt', 'Hello, Node.js!', (err) => {
        if (err) throw err;
        console.log('文件已寫入');
    });
    
    同步寫入:使用 fs.writeFileSync() 來同步地寫入文件。
    const fs = require('fs');
    
    fs.writeFileSync('example.txt', 'Hello, Node.js!');
    console.log('文件已寫入');
    
  • 更新文件:

    非同步追加:使用 fs.appendFile() 將數據追加到文件末尾。
    const fs = require('fs');
    
    fs.appendFile('example.txt', '追加的內容', (err) => {
        if (err) throw err;
        console.log('內容已追加');
    });
    
  • 刪除文件:

    非同步刪除:使用 fs.unlink() 來非同步地刪除文件。
    const fs = require('fs');
    
    fs.unlink('example.txt', (err) => {
        if (err) throw err;
        console.log('文件已刪除');
    });
    
    同步刪除:使用 fs.unlinkSync() 來同步地刪除文件。
    const fs = require('fs');
    
    fs.unlinkSync('example.txt');
    console.log('文件已刪除');
    
  • 列出目錄內容:

    非同步列出:使用 fs.readdir() 列出目錄中的所有文件和子目錄。
    const fs = require('fs');
    
    fs.readdir('myDirectory', (err, files) => {
        if (err) throw err;
        console.log(files);
    });
    
    同步列出:使用 fs.readdirSync() 同步地列出目錄內容。
    const fs = require('fs');
    
    const files = fs.readdirSync('myDirectory');
    console.log(files);
    
  • 創建和刪除目錄:

    創建目錄:使用 fs.mkdir() 創建目錄。
    const fs = require('fs');
    
    fs.mkdir('newDirectory', (err) => {
        if (err) throw err;
        console.log('目錄已創建');
    });
    
    刪除目錄:使用 fs.rmdir() 刪除空目錄。
    const fs = require('fs');
    
    fs.rmdir('oldDirectory', (err) => {
        if (err) throw err;
        console.log('目錄已刪除');
    });
    

path模組

path模組用於處理和轉換文件路徑。

  • path.join():

    功能:將多個路徑片段連接成一個完整的路徑,並自動處理路徑分隔符。
    const path = require('path');
    
    const fullPath = path.join('folder', 'subfolder', 'file.txt');
    console.log(fullPath); // 輸出: 'folder/subfolder/file.txt'(在 Windows 上可能是 'folder\subfolder\file.txt')
    
  • path.resolve():

    功能:功能:解析相對路徑並返回絕對路徑。如果傳入多個路徑片段,path.resolve() 會將它們連接並返回絕對路徑。
    const path = require('path');
    
    const absolutePath = path.resolve('folder', 'subfolder', 'file.txt');
    console.log(absolutePath); // 輸出: 絕對路徑,如 '/home/user/folder/subfolder/file.txt'
    
  • path.normalize():

    功能:正規化路徑,去除多餘的斜杠和回溯。
    const path = require('path');
    
    const normalizedPath = path.normalize('folder//subfolder/../file.txt');
    console.log(normalizedPath); // 輸出: 'folder/file.txt'
    
  • path.basename():

    功能:獲取路徑的最後一部分(即文件名),可以選擇性地指定擴展名。
    const path = require('path');
    
    const baseName = path.basename('/folder/subfolder/file.txt');
    console.log(baseName); // 輸出: 'file.txt'
    
    const baseNameWithoutExt = path.basename('/folder/subfolder/file.txt', '.txt');
    console.log(baseNameWithoutExt); // 輸出: 'file'
    
  • path.dirname():

    功能:獲取路徑的目錄部分。
    const path = require('path');
    
    const dirName = path.dirname('/folder/subfolder/file.txt');
    console.log(dirName); // 輸出: '/folder/subfolder'
    
  • path.extname():

    功能:獲取路徑的擴展名。
    const path = require('path');
    
    const extName = path.extname('/folder/subfolder/file.txt');
    console.log(extName); // 輸出: '.txt'
    
  • path.parse():

    功能:將路徑字符串解析為一個對象,對象包含路徑的各個部分。
    const path = require('path');
    
    const parsedPath = path.parse('/folder/subfolder/file.txt');
    console.log(parsedPath);
    // 輸出: {
    //   root: '/',
    //   dir: '/folder/subfolder',
    //   base: 'file.txt',
    //   ext: '.txt',
    //   name: 'file'
    // }
    
  • path.format():

    功能:將 path.parse() 返回的對象格式化為路徑字符串。
    const path = require('path');
    
    const formattedPath = path.format({
        root: '/',
        dir: '/folder/subfolder',
        base: 'file.txt',
        ext: '.txt',
        name: 'file'
    });
    console.log(formattedPath); // 輸出: '/folder/subfolder/file.txt'
    

events模組

events模組提供事件驅動編程的支持,讓你可以創建和觸發自定義事件。

EventEmitter 類:

EventEmitter 是 events 模組提供的主要類別,它允許你創建和管理事件。

  • 創建 EventEmitter 實例:

    要創建一個 EventEmitter 實例,你需要引入 events 模組並實例化 EventEmitter 類。
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();
    
  • 監聽事件:

    使用 on() 方法來監聽事件。當事件被觸發時,對應的處理程序將被調用。
    myEmitter.on('eventName', (data) => {
    console.log('事件發生,數據:', data);
    });
    
  • 觸發事件:

    使用 emit() 方法來觸發事件,並可以傳遞數據給事件處理程序。
    myEmitter.emit('eventName', data);
    
  • 移除事件處理程序:

    使用 removeListener() 或 off() 方法來移除事件處理程序。removeAllListeners() 用於移除所有處理程序。
    myEmitter.removeListener('eventName', handler);
    myEmitter.off('eventName', handler); // `off` 是 `removeListener` 的別名
    
    // 移除所有處理程序
    myEmitter.removeAllListeners('eventName');
    
  • 事件處理程序的最大數量:

    使用 setMaxListeners() 方法來設置每個事件的最大處理程序數量。默認情況下,Node.js 允許每個事件最多有 10 個處理程序。
    myEmitter.setMaxListeners(n);
    

今天就先看到這邊,今天的字數超級多(其實我很多都是跟chatGPT參考過來的)但是我覺得這樣總比翻看一堆文章之後找不到重點還要好。今天知道這些基本的模組之後,明天就可以先來建立一個簡單的應用了。


上一篇
Day-02 安裝node.js/express
下一篇
Day-04 express練習(上)
系列文
利用 node.js/express 架設網站26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言